package client;

import java.util.ArrayList;

import java.util.List;

import messaage.*;

public class ConnectorWithGui {
	private String sessionID;
	private List<MessagesListener> listeners;

	public ConnectorWithGui() {
		this.sessionID = "";
		this.listeners = new ArrayList<MessagesListener>();
	}

	public void onData(String data) {
		data = data.substring(0, data.length()-1);
		Message mssg = Message.fromString(data);
		if (mssg instanceof ConnectedMsg) {
			for (int i = 0; i < this.listeners.size(); i++) 
				this.listeners.get(i).connected((ConnectedMsg) mssg);
			
		} else {
			if (mssg instanceof DisconnectedMsg) {
				// inform the listeners that the connection has been ended
				// successfully.
				for (int i = 0; i < this.listeners.size(); i++) {
					this.listeners.get(i).disconnected((DisconnectedMsg) mssg);
				}
			} else {
				analyzeMessage(mssg);
			}
		}
	}

	// this method checks the kind of the given message and informs the
	// listeners with
	// the suitable method for each kind of message
	private void analyzeMessage(Message msg) {
		if (msg instanceof ErrorMsg) {
			for (int i = 0; i < this.listeners.size(); i++) {
				if (this.listeners.get(i) != null)
					this.listeners.get(i).errorMessage((ErrorMsg) msg);
			}
			return;
		}
		if (msg instanceof RegisteredMsg) {
			for (int i = 0; i < this.listeners.size(); i++) {
				if (this.listeners.get(i) != null)
					this.listeners.get(i).registered((RegisteredMsg) msg);
			}
			return;
		}
		if (msg instanceof LoggedInMsg) {
			for (int i = 0; i < this.listeners.size(); i++) {
				if (this.listeners.get(i) != null)
					this.listeners.get(i).loggedIn((LoggedInMsg) msg);
			}
			return;
		}
		if (msg instanceof LoggedOffMsg) {
			for (int i = 0; i < this.listeners.size(); i++) {
				if (this.listeners.get(i) != null)
					this.listeners.get(i).loggedOff((LoggedOffMsg) msg);
			}
			return;
		}
		if (msg instanceof AddedForumMsg) {
			for (int i = 0; i < this.listeners.size(); i++) {
				if (this.listeners.get(i) != null)
					this.listeners.get(i).addedForum((AddedForumMsg) msg);
			}
			return;
		}
		if (msg instanceof CreatedThreadMsg) {
			for (int i = 0; i < this.listeners.size(); i++) {
				if (this.listeners.get(i) != null)
					this.listeners.get(i).createdThread((CreatedThreadMsg) msg);
			}
			return;
		}
		if (msg instanceof AddedPostMsg) {
			for (int i = 0; i < this.listeners.size(); i++) {
				if (this.listeners.get(i) != null)
					this.listeners.get(i).addedPost((AddedPostMsg) msg);
			}
			return;
		}
		if (msg instanceof AddedFriendMsg) {
			for (int i = 0; i < this.listeners.size(); i++) {
				if (this.listeners.get(i) != null)
					this.listeners.get(i).addedFriend((AddedFriendMsg) msg);
			}
			return;
		}
		if (msg instanceof RemovedFriendMsg) {
			for (int i = 0; i < this.listeners.size(); i++) {
				if (this.listeners.get(i) != null)
					this.listeners.get(i).removedFriend((RemovedFriendMsg) msg);
			}
			return;
		}
		if (msg instanceof EditedPostMsg) {
			for (int i = 0; i < this.listeners.size(); i++) {
				if (this.listeners.get(i) != null)
					this.listeners.get(i).editedPost((EditedPostMsg) msg);
			}
			return;
		}
		if (msg instanceof GotFriendsListMsg) {
			for (int i = 0; i < this.listeners.size(); i++) {
				if (this.listeners.get(i) != null)
					this.listeners.get(i).gotFriendsList(
							(GotFriendsListMsg) msg);
			}
			return;
		}
		if (msg instanceof GotListOfForumsMsg) {
			for (int i = 0; i < this.listeners.size(); i++) {
				if (this.listeners.get(i) != null)
					this.listeners.get(i).gotListOfForums(
							(GotListOfForumsMsg) msg);
			}
			return;
		}
		if (msg instanceof GotThreadMsg) {
			for (int i = 0; i < this.listeners.size(); i++) {
				if (this.listeners.get(i) != null)
					this.listeners.get(i).gotThread((GotThreadMsg) msg);
			}
			return;
		}
		if (msg instanceof GotTopicsOfForumMsg) {
			for (int i = 0; i < this.listeners.size(); i++) {
				if (this.listeners.get(i) != null)
					this.listeners.get(i).gotTopicsOfForum(
							(GotTopicsOfForumMsg) msg);
			}
			return;
		}
		if (msg instanceof RemovedForumMsg) {
			for (int i = 0; i < this.listeners.size(); i++) {
				if (this.listeners.get(i) != null)
					this.listeners.get(i).removedForum((RemovedForumMsg) msg);
			}
			return;
		}
		if (msg instanceof FriendNotifyMsg){
			for (int i = 0; i < this.listeners.size(); i++) {
				if (this.listeners.get(i) != null)
					this.listeners.get(i).friendNotifyMsgReceived((FriendNotifyMsg) msg);
			}
			return;
		}
		if (msg instanceof ViewerNotifyMsg){
			for (int i = 0; i < this.listeners.size(); i++) {
				if (this.listeners.get(i) != null)
					this.listeners.get(i).viewerNotifyMsgReceived((ViewerNotifyMsg) msg);
			}
			return;
		}
		
		if (msg instanceof RemovedThreadMsg){
			for (int i = 0; i < this.listeners.size(); i++) {
				if (this.listeners.get(i) != null)
					this.listeners.get(i).removedThread((RemovedThreadMsg) msg);
			}
			return;
		}
		
		if (msg instanceof RemovedPostMsg){
			for (int i = 0; i < this.listeners.size(); i++) {
				if (this.listeners.get(i) != null)
					this.listeners.get(i).removedPost((RemovedPostMsg) msg);
			}
			return;
		}
		if (msg instanceof AuthorNotifyMsg){
			for (int i = 0; i < this.listeners.size(); i++) {
				if (this.listeners.get(i) != null)
					this.listeners.get(i).authorNotifyMsgReceived((AuthorNotifyMsg) msg);
			}
			return;
		}
		if (msg instanceof RemovedUserMsg){
			for (int i = 0; i < this.listeners.size(); i++) {
				if (this.listeners.get(i) != null)
					this.listeners.get(i).removedUser((RemovedUserMsg) msg);
			}
			return;
		}
		try {
			throw new Exception("Unknown type of message in ConnectorWithGUI");
		} catch (Exception e) {
		}

	}

	public List<MessagesListener> getListeners() {
		return this.listeners;
	}

	public String getSessionID() {
		return this.sessionID;
	}

	public void addListener(MessagesListener tempListener) {
		this.listeners.add(tempListener);
	}

	public void removeListener(MessagesListener tempListener) {
		this.listeners.remove(tempListener);
	}
}
